package com.ruoyi.tzai.service.tts;

/**
 * TTS服务统一接口
 * 支持多种TTS引擎：Azure Neural TTS等
 * 
 * @author tzai
 * @date 2025-10-27
 */
public interface ITTSService 
{
    /**
     * 生成语音（含词级时间戳）
     * 
     * @param text 文本内容
     * @param language 语言（cn/en）
     * @param voiceName 音色名称
     * @return TTS结果（包含音频URL和时间戳）
     */
    TTSResult generateSpeech(String text, String language, String voiceName);

    /**
     * 测试连接
     * 
     * @return 是否连接成功
     */
    boolean testConnection();

    /**
     * 获取引擎名称
     * 
     * @return 引擎名称
     */
    String getEngineName();

    /**
     * 是否支持词级时间戳
     * 
     * @return 是否支持
     */
    boolean supportsWordTimestamp();

    /**
     * 设置API Key（动态配置，用于任务队列）
     * 
     * @param apiKey API Key
     */
    default void setApiKey(String apiKey) {
        // 默认实现：不支持动态配置
        throw new UnsupportedOperationException("该TTS引擎不支持动态配置API Key");
    }

    /**
     * 设置APP Key（某些TTS引擎需要）
     * 
     * @param appKey APP Key
     */
    default void setAppKey(String appKey) {
        // 默认实现：不支持动态配置
    }

    /**
     * TTS结果封装类
     */
    class TTSResult {
        /** 音频文件URL */
        private String audioUrl;
        
        /** 音频二进制数据（用于任务队列直接上传） */
        private byte[] audioData;
        
        /** 文件元数据（FileInfo的JSON字符串，用于x-file-storage下载） */
        private String fileMetadata;
        
        /** 音频时长（秒） */
        private Double duration;
        
        /** 词级时间戳（JSON格式）
         * 格式: [{"word": "单词", "start": 0.0, "end": 0.5}, ...]
         */
        private String timestamps;
        
        /** 文件大小（字节） */
        private Long fileSize;

        public String getAudioUrl() {
            return audioUrl;
        }

        public void setAudioUrl(String audioUrl) {
            this.audioUrl = audioUrl;
        }

        public byte[] getAudioData() {
            return audioData;
        }

        public void setAudioData(byte[] audioData) {
            this.audioData = audioData;
        }

        public String getFileMetadata() {
            return fileMetadata;
        }

        public void setFileMetadata(String fileMetadata) {
            this.fileMetadata = fileMetadata;
        }

        public Double getDuration() {
            return duration;
        }

        public void setDuration(Double duration) {
            this.duration = duration;
        }

        public String getTimestamps() {
            return timestamps;
        }

        public void setTimestamps(String timestamps) {
            this.timestamps = timestamps;
        }

        public Long getFileSize() {
            return fileSize;
        }

        public void setFileSize(Long fileSize) {
            this.fileSize = fileSize;
        }
    }
}

